1.4.5选择语句
Verilog中的case语句几乎等同于一系列if-elseif-else语句,它将一个表达式的值与一系列其他值进行比较。其语法和功能与C语言中的switch语句有所不同。
always @(*) begin // This is a combinational circuit
case (in)
1'b1: begin
out = 1'b1; // begin-end if >1 statement
end
1'b0: out = 1'b0;
default: out = 1'bx;
endcase
end
- case语句以case开始,每个"case项"以冒号结束,没有"switch"的概念。
- 每个case项仅能执行一个确切的语句,这样就使得在C语言中使用的"break"变得多余。但这也意味着,如果你需要执行多条 语句,就必须使用begin ... end结构。
- 允许存在重复的(及部分重叠的)case项,遇到第一个匹配的项即予以执行。而在C语言中,不允许存在重复的case项。
实践应用
当存在许多分支条件时,使用case语句会比if语句更方便。在这个练习中,你需要创建一个6选1的数据多路复用器。当选择信号(sel)的值在0到5之间时,从相应编号的数据输入(data_input)中选择一个输出。如果sel的值超出这个范围,则输出全0。所有的数据输入和输出都是4位宽。
注意避免无意中推断出锁存器(参考2.4.4 always_if2的内容)。
模块声明
// synthesis verilog_input_version verilog_2001
module top_module (
input [2:0] sel,
input [3:0] data0,
input [3:0] data1,
input [3:0] data2,
input [3:0] data3,
input [3:0] data4,
input [3:0] data5,
output reg [3:0] out );